package opf5.ui;

import java.awt.EventQueue;

import javax.swing.JFrame;

import opf5.entities.creadoresEquipos.CreadorEquipos;
import opf5.entities.creadoresEquipos.CreadorEquiposIntercalados;
import opf5.entities.creadoresEquipos.CreadorEquiposParejos;
import opf5.entities.dominio.Equipo;
import opf5.entities.dominio.Inscripcion;
import opf5.entities.dominio.Jugador;
import opf5.entities.dominio.Partido;
import opf5.entities.ordenadoresJugadores.OrdenadorJugadores;
import opf5.entities.ordenadoresJugadores.OrdenadorJugadoresHandicap;
import opf5.entities.ordenadoresJugadores.OrdenadorJugadoresPromedioNPartidos;
import opf5.entities.ordenadoresJugadores.OrdenadorJugadoresPromedioTotal;
import opf5.entities.ordenadoresJugadores.OrdenadorJugadoresUltimoPromedio;
import opf5.entities.ordenadoresJugadores.OrdenamientoJugadoresMix;
import opf5.entities.partidos.EstadoInscripcionesAbiertas;

import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JButton;
import javax.swing.DefaultComboBoxModel;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JTextField;

public class VistaAdministrarEquipos {

	private JFrame frame;
	private OPF5TablaJugadores tablaEquipo1;
	private OPF5TablaJugadores tablaEquipo2;
	private JComboBox cbxCriterioOrdenamiento;
	private JComboBox cbxCriterioCreacionEquipos;
	private Equipo equipo1;
	private Equipo equipo2;
	private Partido partido;
	private JButton btnConfirmarEquipos;
	private JTextField textField;
	
	private VistaEleccionCriterios eleccionCriterios = new VistaEleccionCriterios();
	
	
	/**
	 * Initialize the contents of the frame.
	 * @wbp.parser.entryPoint
	 */
	void initialize(Partido partido) {
		this.partido = partido;
		
		frame = new JFrame();
		frame.setBounds(100, 100, 478, 374);
		frame.getContentPane().setLayout(null);
		
		JLabel lblCrearEquipo = new JLabel("Crear equipos");
		lblCrearEquipo.setBounds(12, 12, 107, 15);
		frame.getContentPane().add(lblCrearEquipo);
		
		cbxCriterioOrdenamiento = new JComboBox();
		cbxCriterioOrdenamiento.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				actualizarTextBox();
				runCrearEquipo();
			}
		});
		cbxCriterioOrdenamiento.setModel(new DefaultComboBoxModel(new String[] {
				"Handicap",
				"Promedio ultimos n partidos",
				"Promedio de ultimo partido",
				"Mix de criterios"}));
		cbxCriterioOrdenamiento.setBounds(205, 45, 193, 24);
		frame.getContentPane().add(cbxCriterioOrdenamiento);
		
		cbxCriterioCreacionEquipos = new JComboBox();
		cbxCriterioCreacionEquipos.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				runActualizarCampos();
				runCrearEquipo();
			}
		});
		cbxCriterioCreacionEquipos.setModel(new DefaultComboBoxModel(new String[] {"Intercalado", "Parejo"}));
		cbxCriterioCreacionEquipos.setBounds(205, 80, 193, 24);
		frame.getContentPane().add(cbxCriterioCreacionEquipos);
		
		JLabel lblCriterioDeOrdenamiento = new JLabel("Ordenamiento de jugadores");
		lblCriterioDeOrdenamiento.setBounds(12, 50, 215, 15);
		frame.getContentPane().add(lblCriterioDeOrdenamiento);
		
		JLabel lblFormacionDeEquipos = new JLabel("Formacion de equipos");
		lblFormacionDeEquipos.setBounds(12, 88, 193, 15);
		frame.getContentPane().add(lblFormacionDeEquipos);
		
		JLabel lblEquipo = new JLabel("Equipo 1");
		lblEquipo.setBounds(12, 150, 70, 15);
		frame.getContentPane().add(lblEquipo);
		
		JLabel lblEquipo_1 = new JLabel("Equipo 2");
		lblEquipo_1.setBounds(241, 150, 70, 15);
		frame.getContentPane().add(lblEquipo_1);
		
		tablaEquipo1 = new OPF5TablaJugadores();
		tablaEquipo1.setBounds(12, 181, 215, 106);
		frame.getContentPane().add(tablaEquipo1);
		
		tablaEquipo2 = new OPF5TablaJugadores();
		tablaEquipo2.setBounds(240, 181, 215, 106);
		frame.getContentPane().add(tablaEquipo2);
		
		btnConfirmarEquipos = new JButton("Confirmar Equipos");
		btnConfirmarEquipos.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				runConfirmarEquipos();
			}
		});
		btnConfirmarEquipos.setBounds(253, 299, 202, 25);
		frame.getContentPane().add(btnConfirmarEquipos);
		
		textField = new JTextField();
		textField.setText("1");
		textField.setBounds(408, 47, 33, 20);
		frame.getContentPane().add(textField);
		textField.setColumns(10);

		
		this.textField.setVisible(false);
		cargarDatos();
		
		final VistaAdministrarEquipos window = this;
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	protected void actualizarTextBox() {
		if (this.cbxCriterioOrdenamiento.getSelectedIndex() == 1)
			this.textField.setVisible(true);
		else
			this.textField.setVisible(false);
	}

	protected void runActualizarCampos() {
		if (this.cbxCriterioOrdenamiento.getSelectedIndex() == 1)
			this.textField.setVisible(true);
		else
			this.textField.setVisible(false);
	}

	protected void runConfirmarEquipos() {
		int respuesta = JOptionPane.showConfirmDialog(frame, "Esta seguro que desea confirmar los equipos?\n"
				+ "Una vez confirmados no podran ser cambiados.");
	
		if (respuesta != 0) {return;}
		
		partido.confirmarEquipos(equipo1, equipo2);
		
		JOptionPane.showMessageDialog(frame, "Equipos confirmados");
		
		cargarDatos();
	}

	private void cargarDatos() {
		if (partido.getEstado().getClass() != EstadoInscripcionesAbiertas.class) {
			this.cbxCriterioCreacionEquipos.setEnabled(false);
			this.cbxCriterioOrdenamiento.setEnabled(false);
			this.btnConfirmarEquipos.setEnabled(false);
			this.equipo1 = partido.getEquipos().get(0);
			this.equipo2 = partido.getEquipos().get(1);
			this.mostrarEquipos();
		} else {
			this.runCrearEquipo();
		}
	}

	protected void runCrearEquipo() {
		OrdenadorJugadores ordenador = this.getOrdenadorJugadores();
		if (ordenador == null)
			return;
		CreadorEquipos creador = this.getCreadorEquipos();
		List<Jugador> jugadores = this.getJugadores();

		List<Jugador> jugadoresOrdenados = ordenador.ordenarJugadores(jugadores);
		equipo1 = creador.crearEquipo1(jugadoresOrdenados);
		equipo2 = creador.crearEquipo2(jugadoresOrdenados);
		
		this.mostrarEquipos();
	}

	private void mostrarEquipos() {
		this.tablaEquipo1.cargarJugadoresModelo(equipo1.getJugadores());
		this.tablaEquipo2.cargarJugadoresModelo(equipo2.getJugadores());
	}

	private List<Jugador> getJugadores() {
		List<Jugador> jugadores = new ArrayList<Jugador>();
		List<Inscripcion> inscripciones = partido.getInscripciones();
		
		for (Inscripcion i : inscripciones) {
			jugadores.add(i.getJugador());
		}
		
		return jugadores;
	}

	private CreadorEquipos getCreadorEquipos() {
		int seleccion = this.cbxCriterioCreacionEquipos.getSelectedIndex();
		switch (seleccion) {
		case 0:
			return new CreadorEquiposIntercalados();
		case 1:
			return new CreadorEquiposParejos();
		}
		
		return new CreadorEquiposIntercalados(); 
	}

	private OrdenadorJugadores getOrdenadorJugadores() {
		int seleccion = this.cbxCriterioOrdenamiento.getSelectedIndex();
		switch (seleccion) {
		case 0:
			return new OrdenadorJugadoresHandicap();
		case 1:
			return new OrdenadorJugadoresPromedioNPartidos(new Integer(this.textField.getText()));
		case 2:
			return new OrdenadorJugadoresUltimoPromedio();
		case 3:
			getOrdenadorMix();
		}
		
		return null;
	}

	private void getOrdenadorMix() {
		this.eleccionCriterios = new VistaEleccionCriterios();
		this.eleccionCriterios.initialize(this);
	}

	public void setOrdenamiento(OrdenamientoJugadoresMix ordenamientoJugadoresMix) {
		OrdenadorJugadores ordenador = ordenamientoJugadoresMix;
		CreadorEquipos creador = this.getCreadorEquipos();
		List<Jugador> jugadores = this.getJugadores();

		List<Jugador> jugadoresOrdenados = ordenador.ordenarJugadores(jugadores);
		equipo1 = creador.crearEquipo1(jugadoresOrdenados);
		equipo2 = creador.crearEquipo2(jugadoresOrdenados);
		
		this.mostrarEquipos();		
	}
}
